{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from qiskit import QuantumCircuit\n",
    "from qiskit.quantum_info import Kraus, SuperOp\n",
    "from qiskit.visualization import plot_histogram\n",
    "from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\n",
    "from qiskit_aer import AerSimulator\n",
    " \n",
    "# Import from Qiskit Aer noise module\n",
    "from qiskit_aer.noise import (\n",
    "    NoiseModel,\n",
    "    QuantumError,\n",
    "    ReadoutError,\n",
    "    depolarizing_error,\n",
    "    pauli_error,\n",
    "    thermal_relaxation_error,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# use IBM Runtime machine's noise as the local simulator's noise"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit_ibm_runtime import QiskitRuntimeService\n",
    "from utils.core.benchmark import BenchmarkCircuit   \n",
    "\n",
    "token = '082efb76ccb31ea69bf8845704da7da4047ecc168e4442abf53d39f7da4d025338a3fa99a2fd7eef6a6b4fdce0ce6e989eec54f2bff62b034f98f1eeea4a6bee'\n",
    "service = QiskitRuntimeService()\n",
    "backend = service.backend(\"ibm_brisbane\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit_aer.noise import NoiseModel\n",
    "\n",
    "noise_model = NoiseModel.from_backend(backend)\n",
    "\n",
    "# Create noisy simulator backend\n",
    "sim_noise = AerSimulator(noise_model=noise_model)\n",
    "\n",
    "# Transpile circuit for noisy basis gates\n",
    "passmanager = generate_preset_pass_manager(\n",
    "    optimization_level=3, backend=sim_noise\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "benchmark = BenchmarkCircuit(num_qubits=2)\n",
    "\n",
    "# Generate all basis circuits\n",
    "benchmark_circuits = benchmark.generate_basis_circuits()\n",
    "shots = 1000\n",
    "\n",
    "# Transpile all benchmark circuits\n",
    "transpiled_circuits = passmanager.run(benchmark_circuits)\n",
    "\n",
    "# Initialize a list to store results for each circuit\n",
    "circuit_results = []\n",
    "\n",
    "# Run all transpiled circuits on the noisy simulator\n",
    "job = sim_noise.run(transpiled_circuits, shots=shots)\n",
    "result = job.result()\n",
    "\n",
    "# Get the counts dictionary for each circuit\n",
    "for i in range(len(benchmark_circuits)):\n",
    "    counts_dict = result.get_counts(i)\n",
    "    circuit_results.append(counts_dict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.945, 0.031, 0.016, 0.001],\n",
       "       [0.033, 0.941, 0.001, 0.017],\n",
       "       [0.021, 0.001, 0.943, 0.028],\n",
       "       [0.001, 0.027, 0.04 , 0.954]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "benchmark.generate_transition_matrix(circuit_results)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# use Fackprovider to simulate the noise\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## show the provider's layout"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Transition matrix from fake backend:\n",
      "[[9.886e-01 2.200e-02 3.500e-02 9.000e-04]\n",
      " [6.400e-03 9.725e-01 2.000e-04 3.720e-02]\n",
      " [5.000e-03 1.000e-04 9.591e-01 2.230e-02]\n",
      " [3.000e-04 5.400e-03 5.700e-03 9.396e-01]]\n"
     ]
    }
   ],
   "source": [
    "from qiskit_ibm_runtime.fake_provider import FakeGuadalupeV2\n",
    "from utils.core.benchmark import BenchmarkCircuit  # Fixed import to use BenchmarkCircuit instead of Benchmark\n",
    "\n",
    "# Initialize the fake backend\n",
    "backend = FakeGuadalupeV2()\n",
    "\n",
    "# Create a benchmark circuit for the backend\n",
    "benchmark_fake = BenchmarkCircuit(num_qubits=2,  # Using 2 qubits for simplicity\n",
    "                                 qubit_indices=[0, 1])  # Using first two qubits\n",
    "\n",
    "# Generate basis circuits\n",
    "benchmark_circuits_fake = benchmark_fake.generate_basis_circuits()\n",
    "\n",
    "# Create a pass manager for the backend\n",
    "pm = generate_preset_pass_manager(optimization_level=1, backend=backend)\n",
    "\n",
    "# Transpile the circuits\n",
    "transpiled_circuits_fake = pm.run(benchmark_circuits_fake)\n",
    "\n",
    "# Run the circuits on the fake backend\n",
    "shots = 10000\n",
    "job_fake = backend.run(transpiled_circuits_fake, shots=shots)\n",
    "result_fake = job_fake.result()\n",
    "\n",
    "# Get the counts for each circuit\n",
    "fake_results = []\n",
    "for i in range(len(benchmark_circuits_fake)):\n",
    "    counts_dict = result_fake.get_counts(i)\n",
    "    fake_results.append(counts_dict)\n",
    "\n",
    "# Generate the transition matrix\n",
    "transition_matrix_fake = benchmark_fake.generate_transition_matrix(fake_results)\n",
    "print(\"Transition matrix from fake backend:\")\n",
    "print(transition_matrix_fake)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 713x492.2 with 1 Axes>"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Visualize the device layout and qubit connectivity\n",
    "import matplotlib.pyplot as plt\n",
    "import networkx as nx\n",
    "from qiskit.visualization import plot_gate_map\n",
    "\n",
    "plot_gate_map(backend)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.21"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
